// 应用更新工具
import { showConfirmDialog, showToast } from 'vant'

// 版本信息接口
interface VersionInfo {
  version: string
  versionCode: number
  downloadUrl: string
  updateLog: string
  forceUpdate: boolean
  minVersion: string
}

// 当前应用版本（需要与config.xml中的版本一致）
const CURRENT_VERSION = '2.0.0'
const CURRENT_VERSION_CODE = 10

// 版本信息URL - Gitee仓库
// 格式：https://gitee.com/用户名/仓库名/raw/master/version.json
const VERSION_CHECK_URL = 'https://gitee.com/zhang_mengzhao/bookkeeping-app/raw/master/version.json'

/**
 * 比较版本号
 * @param v1 版本1
 * @param v2 版本2
 * @returns 1: v1>v2, 0: v1==v2, -1: v1<v2
 */
function compareVersion(v1: string, v2: string): number {
  const parts1 = v1.split('.').map(Number)
  const parts2 = v2.split('.').map(Number)
  
  for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
    const p1 = parts1[i] || 0
    const p2 = parts2[i] || 0
    
    if (p1 > p2) return 1
    if (p1 < p2) return -1
  }
  
  return 0
}

/**
 * 检查是否有新版本
 */
export async function checkForUpdate(silent = false): Promise<VersionInfo | null> {
  try {
    console.log('🔍 检查应用更新...')
    console.log('📍 版本检查URL:', VERSION_CHECK_URL)
    console.log('📱 当前版本:', CURRENT_VERSION, 'versionCode:', CURRENT_VERSION_CODE)
    
    const response = await fetch(VERSION_CHECK_URL, {
      method: 'GET',
      cache: 'no-cache',
      headers: {
        'Accept': 'application/json'
      }
    })
    
    console.log('📡 响应状态:', response.status, response.statusText)
    
    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`)
    }
    
    const versionInfo: VersionInfo = await response.json()
    console.log('📦 远程版本信息:', versionInfo)
    
    // 比较版本号
    const hasUpdate = compareVersion(versionInfo.version, CURRENT_VERSION) > 0
    
    if (hasUpdate) {
      console.log('✨ 发现新版本:', versionInfo.version, '(当前:', CURRENT_VERSION, ')')
      return versionInfo
    } else {
      console.log('✅ 已是最新版本')
      if (!silent) {
        showToast('已是最新版本')
      }
      return null
    }
  } catch (error: any) {
    console.error('❌ 检查更新失败:', error)
    console.error('❌ 错误详情:', {
      name: error?.name,
      message: error?.message,
      stack: error?.stack
    })
    if (!silent) {
      const errorMsg = error?.message || '未知错误'
      showToast(`检查更新失败: ${errorMsg}`)
    }
    return null
  }
}

/**
 * 显示更新对话框
 */
export async function showUpdateDialog(versionInfo: VersionInfo): Promise<void> {
  const message = `发现新版本 v${versionInfo.version}\n\n更新内容：\n${versionInfo.updateLog}`
  
  try {
    await showConfirmDialog({
      title: versionInfo.forceUpdate ? '强制更新' : '版本更新',
      message,
      confirmButtonText: '立即更新',
      cancelButtonText: versionInfo.forceUpdate ? '' : '暂不更新',
      closeOnClickOverlay: !versionInfo.forceUpdate,
      allowCancel: !versionInfo.forceUpdate
    })
    
    // 用户点击更新
    await downloadAndInstall(versionInfo.downloadUrl)
  } catch (error) {
    // 用户取消更新（非强制更新情况）
    if (!versionInfo.forceUpdate) {
      console.log('用户取消更新')
    }
  }
}

/**
 * 下载并安装APK
 */
async function downloadAndInstall(downloadUrl: string): Promise<void> {
  // 检查是否在Cordova环境
  if (!(window as any).cordova) {
    showToast('请在手机应用中使用此功能')
    // 浏览器环境：直接打开下载链接
    window.open(downloadUrl, '_blank')
    return
  }
  
  showToast('开始下载更新...')
  
  try {
    // 使用Cordova InAppBrowser插件打开下载链接
    // 或使用原生下载管理器
    if ((window as any).cordova.InAppBrowser) {
      (window as any).cordova.InAppBrowser.open(downloadUrl, '_system')
    } else {
      // 备用方案：打开系统浏览器下载
      window.open(downloadUrl, '_system')
    }
    
    showToast('请在浏览器中完成下载和安装')
  } catch (error) {
    console.error('❌ 下载失败:', error)
    showToast('下载失败，请稍后重试')
  }
}

/**
 * 自动检查更新（应用启动时调用）
 */
export async function autoCheckUpdate(): Promise<void> {
  // 静默检查更新
  const versionInfo = await checkForUpdate(true)
  
  if (versionInfo) {
    // 显示更新对话框
    await showUpdateDialog(versionInfo)
  }
}

/**
 * 手动检查更新（设置页面调用）
 */
export async function manualCheckUpdate(): Promise<void> {
  showToast('正在检查更新...')
  
  const versionInfo = await checkForUpdate(false)
  
  if (versionInfo) {
    await showUpdateDialog(versionInfo)
  }
}

/**
 * 获取当前版本信息
 */
export function getCurrentVersion(): string {
  return CURRENT_VERSION
}

